{{- $ClassName := .ClassName}}
package view

import (
    {{.time}}
    "reflect"
    "github.com/liuxd6825/dapr-go-ddd-sdk/errors"
    base "{{.Namespace}}/pkg/query-service/infrastructure/base/domain/view"
)

//
// {{.ClassName}}
// @Description: {{.Description}}
//
type {{.ClassName}} struct {
    {{- if .IsNeo4j }}
        {{- if isNodeName .Name }}
    base.BaseNodeView `bson:",inline"`
        {{- else if isRelationName .Name  }}
    base.BaseRelationView `bson:",inline"`
        {{- else  }}
    base.BaseView `bson:",inline"`
        {{- end }}
    {{- else }}
    base.BaseView `bson:",inline"`
    {{- end }}
{{- range $name, $property := .Properties}}
{{- if not $property.IsArray}}
    {{$property.UpperName}} {{if $property.IsArray}}[]*{{end}}{{$property.LanType}} `json:"{{$property.JsonName}},omitempty" bson:"{{$property.BsonName}}" {{if $property.HasValidate}} validate:"{{$property.Validate}}"{{- end}} {{$property.GormTagName}} description:"{{$property.Description}}"` {{if $property.HasDescription }} // {{$property.Description}}{{ end }}
{{- end}}
{{- end}}
}


//
// {{.ClassName}}Metadata
// @Description: 获取{{.ClassName}}元数据
//
type {{.ClassName}}Metadata struct {
    {{- if .IsNeo4j }}
        {{- if isNodeName .Name }}
    base.BaseNodeViewMetadata  `json:"-"`
        {{- else if isRelationName .Name  }}
    base.BaseRelationViewMetadata `json:"-"`
        {{- else  }}
    base.BaseViewMetadata `json:"-"`
        {{- end }}
    {{- else }}
    base.BaseViewMetadata `json:"-"`
    {{- end }}
{{- range $name, $property := .Properties}}
{{- if not $property.IsArray}}
    {{$property.UpperName}} metadata.Property `json:"-"`
{{- end}}
{{- end}}
	Properties  metadata.Properties  `json:"properties"`
}

var (
    _{{.name}}Metadata = new{{.ClassName}}Metadata()
)

//
// Get{{.ClassName}}Metadata
// @Description: 获取 {{.Description}}Metadata
//
func Get{{.ClassName}}Metadata() *{{.ClassName}}Metadata {
    return _{{.name}}Metadata
}

//
// new{{.ClassName}}Metadata()
// @Description: 新建{{.Description}} Metadata
//
func new{{.ClassName}}Metadata() *{{.ClassName}}Metadata{
	v := &{{.ClassName}}{}
	m := &{{.ClassName}}Metadata{}
    if err := metadata.InitMetadata(m, v); err != nil {
        panic(err)
    }
    return m
}

//
// New{{.ClassName}}
// @Description: {{.Description}}
//
func New{{.ClassName}}()*{{.ClassName}}{
    return &{{.ClassName}}{}
}



//
// New{{.ClassName}}
// @Description: {{.Description}}
//
func New{{.ClassName}}()*{{.ClassName}}{
    return &{{.ClassName}}{}
}

//
// Equal
// @Description:  对比{{.Description}}
//
func (v *{{.ClassName}}) Equal(v2 *{{.ClassName}}) error {
	var msg []string
    {{- range $name, $property := .AllViewProperties}}
        {{- if not $property.IsArray}}
            {{- if $property.IsTime }}
    if !timeutils.Equal(v.{{$name}}, v2.{{$name}}) {
        msg = append(msg, "{{$name}}")
    }
            {{- else }}
    if !reflect.DeepEqual(v.{{$name}}, v2.{{$name}}) {
        msg = append(msg, "{{$name}}")
    }
            {{- end }}
        {{- end }}
    {{- end }}
	var err error
	if len(msg) > 0{
	    err = errors.New(strings.Join(msg, ","))
	}
	return err
}

